package main

import (
	"embed"
	"flag"
	"fmt"
	"os"
	"time"

	"gitee.com/liumou_site/ddns-go/model"
	"gitee.com/liumou_site/logger"
)

//go:embed web/*
var webFS embed.FS

var (
	debug                  bool   // 是否开启调试模式，开启后会显示详细日志信息
	show                   bool   // 是否显示程序简介，设置为true时会显示简介后退出程序
	ver                    bool   // 是否显示版本信息，设置为true时会显示版本号后退出程序
	template               bool   // 是否生成配置文件模板
	Sec                    int    // DNS记录更新间隔时间(秒)，默认值为60秒
	IP6Url                 string // IPv6地址查询API的URL地址，可从环境变量UrlIp6Api获取
	Config                 string // 配置文件路径，可通过命令行参数-c指定
	List                   bool   // 是否显示域名列表
	Service                bool   // 是否为服务模式，设置为true时会在系统启动时自动执行DNS更新
	SpecifyNetworkCard     bool   // 是否指定网卡，设置为true时会在系统启动时自动执行DNS更新
	SpecifyNetworkCardName string // 指定网卡名称
	Web                    bool   // 是否启动Web界面
	WebPort                int    // Web服务器端口
)

func main() {
	// 打印项目网站
	fmt.Println("https://liumou.site")
	// 定义当前版本号
	version := "3.4.0"
	// 默认配置文件路径
	file := "/opt/apps/com.liumou.ddns-tencent/ddns.toml"

	// 初始化命令行参数解析
	gfs := flag.NewFlagSet("ddns-go", flag.ExitOnError)
	gfs.StringVar(&Config, "c", file, "设置配置文件路径")
	gfs.IntVar(&Sec, "sec", model.GetEnvSec(), "下一次更新间隔时间(秒)")
	gfs.StringVar(&IP6Url, "u6", model.GetEnvIP6Url(), "设置IPV6查询接口地址")
	gfs.BoolVar(&List, "list", false, "显示域名列表")
	gfs.BoolVar(&SpecifyNetworkCard, "s", false, "是否指定网卡,设置为true时会通过特定网卡获取IP地址")
	gfs.StringVar(&SpecifyNetworkCardName, "n", "", "指定网卡名称")
	gfs.BoolVar(&Service, "service", false, "是否为服务模式,设置为true时会在系统启动时自动执行DNS更新")
	gfs.BoolVar(&debug, "debug", model.GetEnvDebug(), "显示程序运行详细日志信息")
	gfs.BoolVar(&show, "show", false, "显示程序简介")
	gfs.BoolVar(&ver, "v", false, "显示版本信息")
	gfs.BoolVar(&template, "template", false, "生成配置文件模板")
	gfs.BoolVar(&Web, "web", true, "启动Web界面")
	gfs.IntVar(&WebPort, "port", 8080, "Web服务器端口")

	// 解析命令行参数
	args := os.Args
	err := gfs.Parse(args[1:])
	if err != nil {
		return
	}

	// 处理show参数：显示程序简介后退出
	if show {
		fmt.Println("这是一个腾讯云平台自动化更新域名的程序,支持IPV6/IPV4")
		os.Exit(0)
	}
	if SpecifyNetworkCard {
		if len(SpecifyNetworkCardName) == 0 {
			fmt.Println("请指定网卡名称")
			os.Exit(1)
		}
	}

	// 处理ver参数：显示版本信息后退出
	if ver {
		fmt.Println(version)
		os.Exit(0)
	}

	// 处理template参数：生成配置文件模板后退出
	if template {
		err = model.GenerateConfigTemplate("")
		if err != nil {
			fmt.Printf("生成配置文件模板失败: %v\n", err)
			os.Exit(1)
		}
		fmt.Println("配置文件模板已生成到当前目录: ddns.toml")
		os.Exit(0)
	}

	logger.Info("ddns-go v" + version)
	if Service {
		err = model.CreateService(Config)
		if err != nil {
			os.Exit(1)
		}
		os.Exit(0)
	}

	// 初始化DDNS服务
	l := model.NewLogin()
	l.ConfigFile = Config
	l.ConfigGet()   // 读取配置文件
	l.Debug = debug // 设置调试模式
	l.IPS.Debug = debug
	l.IPS.IpType = l.Domain.Domain.Type // 设置IP类型(IPv4/IPv6)
	l.IPS.UrlIp6Api = IP6Url            // 设置IPv6查询API
	// 设置指定网卡
	l.IPS.SpecifyNetworkCard = SpecifyNetworkCard
	l.IPS.SpecifyNetworkCardName = SpecifyNetworkCardName

	if List {
		l.ShowList()
	}

	// 如果启用了Web界面，启动Web服务器（在后台运行）
	if Web {
		webServer := model.NewWebServer(l, WebPort, version, webFS)
		go func() {
			err := webServer.Start()
			if err != nil {
				logger.Error("Web服务器启动失败: %v", err)
			}
		}()
	}

	// 主循环：持续执行DNS更新（无论是否启用Web界面）
	for {
		l.Start() // 开始执行DNS更新
		// 记录日志并等待下次执行
		logger.Info("本次更新完成,正在等待下次更新,当前设置等待时间: ", Sec, "秒")
		time.Sleep(time.Duration(Sec) * time.Second)
	}
}
